import store from '@/store'
import config from '@/config'
import { getAccessToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { toast, showConfirm, tansParams } from '@/utils/common'

let timeout = 10000

// 获取全局modal实例的辅助函数
function getGlobalModal() {
  // 尝试获取全局的$modal实例
  const app = getApp()
  if (app && app.$modal) {
    return app.$modal
  }
  
  // 尝试通过uni对象获取
  if (uni.$modal) {
    return uni.$modal
  }
  
  // 如果都找不到，返回null
  return null
}

// 获取动态的baseUrl
function getDynamicBaseUrl() {
	//mumu模拟器测试地址
	//return 'http://192.168.8.66:48080/admin-api'

  try {
    // 重新导入config以获取最新的baseUrl
    const config = require('@/config.js')
    // 每次都重新调用getDynamicBaseUrl获取最新的baseUrl
    return config.getDynamicBaseUrl() + config.baseApi
  } catch (error) {
    console.error('获取动态baseUrl失败:', error)
    // 失败时返回默认配置
    return 'http://192.168.8.66:48080/admin-api'
  }
}

// 兼容旧函数名
function getBaseUrl() {
  return getDynamicBaseUrl()
}



const request = config => {
  // 获取动态的baseUrl
  const currentBaseUrl = getDynamicBaseUrl()
  
  // 添加请求日志
  console.log('=== HTTP请求开始 ===')
  console.log('请求配置:', {
    method: config.method || 'get',
    url: config.url,
    params: config.params,
    data: config.data,
    baseUrl: config.baseUrl || currentBaseUrl
  })
  
  // 是否需要设置 token
  const isToken = (config.headers || {}).isToken === false
  config.header = config.header || {}
  if (getAccessToken() && !isToken) {
    config.header['Authorization'] = 'Bearer ' + getAccessToken()
  }
  // 设置租户 TODO 芋艿：强制 1 先
  config.header['tenant-id'] = '1';
  // 设置Content-Type（POST/PUT请求需要）
  if (config.method && (config.method.toLowerCase() === 'post' || config.method.toLowerCase() === 'put')) {
    if (!config.header['Content-Type'] && !config.header['content-type']) {
      config.header['Content-Type'] = 'application/json';
    }
  }
  
  // 构建完整URL
  let fullUrl = config.baseUrl || currentBaseUrl + config.url
  console.log('完整请求URL:', fullUrl)
  
  // get请求映射params参数
  if (config.params) {
    let url = config.url + '?' + tansParams(config.params)
    url = url.slice(0, -1)
    config.url = url
    fullUrl = config.baseUrl || currentBaseUrl + config.url
    console.log('带参数的完整URL:', fullUrl)
  }
  
  return new Promise((resolve, reject) => {
    uni.request({
        method: config.method || 'get',
        timeout: config.timeout ||  timeout,
        url: config.baseUrl || currentBaseUrl + config.url,
        data: config.data,
        // header: config.header,
        header: config.header,
        dataType: 'json'
      }).then(response => {
        console.log('HTTP响应原始数据:', response)
        let [error, res] = response
        if (error) {
          console.error('HTTP请求错误:', error)
          const modal = getGlobalModal()
          if (modal && modal.showCustomToast) {
            modal.showCustomToast('后端接口连接异常', 'error')
          } else {
            toast('后端接口连接异常')
          }
          reject('后端接口连接异常')
          return
        }
        console.log('HTTP响应数据:', res)
        console.log('响应状态码:', res.statusCode)
        console.log('响应数据:', res.data)
        // 如果是404错误，输出更详细的信息
        if (res.statusCode === 404) {
          console.error('=== 404错误详情 ===')
          console.error('请求URL:', config.baseUrl || currentBaseUrl + config.url)
          console.error('请求方法:', config.method || 'get')
          console.error('请求头:', config.header)
          console.error('请求数据:', config.data)
          console.error('响应头:', res.header)
        }
        
        const code = res.data.code || 200
        const msg = errorCode[code] || res.data.msg || errorCode['default']
        
        // 401错误处理 - 禁用token自动刷新，只有退出或关闭时才清空token
        if (code === 401) {
          console.warn('Token已过期或无效，不自动刷新，等待用户重新登录')
          // 显示确认框让用户重新登录
          showConfirm('登录已过期', '您的登录状态已过期，请重新登录').then(() => {
            // 用户确认后跳转到登录页
            uni.navigateTo({
              url: '/pages/login'
            })
          }).catch(() => {
            // 用户取消也跳转到登录页
            uni.navigateTo({
              url: '/pages/login'
            })
          })
          reject('登录已过期')
        } else if (code === 403) {
          console.warn('当前操作没有权限')
          // 权限不足时，给用户更友好的提示，不强制跳转登录页
          const modal = getGlobalModal()
          if (modal && modal.showCustomToast) {
            modal.showCustomToast('您当前没有操作权限，请联系管理员', 'warning')
          } else {
            toast('您当前没有操作权限，请联系管理员')
          }
          // 返回权限不足的错误信息，但不强制跳转登录页
          reject({
            code: 403,
            msg: '权限不足',
            data: res.data,
            response: res
          })
        } else if (code === 500) {
          const modal = getGlobalModal()
          if (modal && modal.showCustomToast) {
            modal.showCustomToast(msg, 'error')
          } else {
            toast(msg)
          }
          reject('500')
        } else if (code !== 200) {
          const modal = getGlobalModal()
          if (modal && modal.showCustomToast) {
            modal.showCustomToast(msg, 'warning')
          } else {
            toast(msg)
          }
          // 返回完整的错误对象，包含响应数据
          reject({
            code: code,
            msg: msg,
            data: res.data,
            response: res
          })
        } else {
          resolve(res.data)
        }
      })
      .catch(error => {
        let { message } = error
        if (message === 'Network Error') {
          message = '后端接口连接异常'
        } else if (message.includes('timeout')) {
          message = '系统接口请求超时'
        } else if (message.includes('Request failed with status code')) {
          message = '系统接口' + message.substr(message.length - 3) + '异常'
        }
        const modal = getGlobalModal()
        if (modal && modal.showCustomToast) {
          modal.showCustomToast(message, 'error')
        } else {
          toast(message)
        }
        reject(error)
      })
  })
}

export default request
